import java.io.*;
import java.util.*;
import java.util.concurrent.*;

public class test {
    // 🐍 蛇的身体坐标
    static LinkedList<Point> snake = new LinkedList<>();
    static char direction = 'D'; // 初始方向（WASD控制）
    static Point food = new Point(5, 5); // 食物位置（临时示例）
    
    public static void main(String[] args) throws Exception {
        // 🐍 初始化蛇（3节身体）
        snake.add(new Point(10, 10));
        snake.add(new Point(10, 11));
        snake.add(new Point(10, 12));

        // 🎮 启动键盘监听线程（关键！）
        startKeyListener();

        // 🕹️ 游戏主循环
        while (true) {
            moveSnake();
            drawGame();
            TimeUnit.MILLISECONDS.sleep(200); // 控制速度
        }
    }

    // 🖌️ 绘制游戏画面（控制台版）
    static void drawGame() {
        // 清屏（用转义序列）
        System.out.print("\033[H\033[2J"); 
        
        // 画边界和蛇
        for (int y = 0; y < 20; y++) {
            for (int x = 0; x < 30; x++) {
                Point p = new Point(x, y);
                if (x == 0 || x == 29 || y == 0 || y == 19) {
                    System.out.print('#'); // 墙壁
                } else if (snake.contains(p)) {
                    System.out.print(snake.getFirst().equals(p) ? 'O' : 'o'); // 蛇头O，身体o
                } else if (p.equals(food)) {
                    System.out.print('*'); // 食物
                } else {
                    System.out.print(' ');
                }
            }
            System.out.println();
        }
    }

    // 🚀 移动逻辑（和之前类似）
    static void moveSnake() {
        Point head = snake.getFirst();
        Point newHead = new Point(head.x, head.y);

        switch (direction) {
            case 'W': newHead.y--; break;
            case 'S': newHead.y++; break;
            case 'A': newHead.x--; break;
            case 'D': newHead.x++; break;
        }

        // 碰撞检测
        if (newHead.x <= 0 || newHead.x >= 29 || newHead.y <= 0 || newHead.y >= 19 
            || snake.contains(newHead)) {
            System.out.println("Game Over!");
            System.exit(0);
        }

        snake.addFirst(newHead);
        if (!newHead.equals(food)) {
            snake.removeLast();
        } else {
            // 吃到食物后生成新食物
            generateFood();
        }
    }

    // 🍎 生成新食物（简单示例）
    static void generateFood() {
        Random rand = new Random();
        food = new Point(rand.nextInt(27) + 1, rand.nextInt(17) + 1);
    }

    // 🎹 键盘监听线程（核心！）
    static void startKeyListener() {
        new Thread(() -> {
            try {
                while (true) {
                    int input = System.in.read(); // 会阻塞，所以要单独线程
                    char cmd = Character.toUpperCase((char) input);
                    
                    // 方向限制（比如不能从D直接按A）
                    if ((cmd == 'A' && direction != 'D') ||
                        (cmd == 'D' && direction != 'A') ||
                        (cmd == 'W' && direction != 'S') ||
                        (cmd == 'S' && direction != 'W')) {
                        direction = cmd;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();
    }
}

class Point {
    int x, y;
    Point(int x, int y) { this.x = x; this.y = y; }
    
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        Point p = (Point) o;
        return x == p.x && y == p.y;
    }
}

